package com.codemart.lanze.config.shiro;
// package com.codemart.lanze.config.shiro;
//
// import java.util.LinkedHashMap;
// import java.util.Map;
//
// import javax.servlet.Filter;
//
// import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
// import org.apache.shiro.mgt.SecurityManager;
// import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
// import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
// import org.apache.shiro.web.filter.authc.LogoutFilter;
// import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
// import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
// import org.slf4j.Logger;
// import org.slf4j.LoggerFactory;
// import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
// import org.springframework.context.annotation.Bean;
// import org.springframework.context.annotation.Configuration;
// import org.springframework.data.redis.cache.RedisCacheManager;
//
// import com.codemart.lanze.modules.sys.shiro.filter.KickoutSessionControlFilter;
// import com.codemart.lanze.modules.sys.shiro.filter.LoginFilter;
// import com.codemart.lanze.modules.sys.shiro.filter.SystemLogoutFilter;
//
// import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
//
// @Configuration
// public class ShiroConfig {
//
// private Logger logger = LoggerFactory.getLogger(this.getClass());
//
// // @Bean
// // public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
// // logger.info("ShiroConfiguration.shirFilter()");
// //
// // ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// // shiroFilterFactoryBean.setSecurityManager(securityManager);
// //
// // // 获取filters
// // Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();
// // // 将自定义的FormAuthenticationFilter注入shiroFilter中（验证码校验）
// //// filters.put("authc", new CustomFormAuthenticationFilter());
// //
// // // 拦截器.
// // Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
// // // 配置不会被拦截的链接 顺序判断
// // filterChainDefinitionMap.put("/static/**", "anon");
// // filterChainDefinitionMap.put("/kaptcha/**", "anon");
// // // 配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
// // filterChainDefinitionMap.put("/logout", "logout");
// // // <!-- 过滤链定义，从上向下顺序执行，一般将/**放在最为下边 -->:这是一个坑呢，一不小心代码就不好使了;
// // // <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
// // filterChainDefinitionMap.put("/**", "authc");
// // // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
// // shiroFilterFactoryBean.setLoginUrl("/login");
// // // 登录成功后要跳转的链接
// // shiroFilterFactoryBean.setSuccessUrl("/index");
// //
// // // 未授权界面;
// // shiroFilterFactoryBean.setUnauthorizedUrl("/403");
// // shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
// // return shiroFilterFactoryBean;
// // }
// /**
// * ShiroFilterFactoryBean 处理拦截资源文件问题。 注意：单独一个ShiroFilterFactoryBean配置是或报错的，以为在 初始化ShiroFilterFactoryBean的时候需要注入：SecurityManager
// * <p>
// * Filter Chain定义说明 1、一个URL可以配置多个Filter，使用逗号分隔 2、当设置多个过滤器时，全部验证通过，才视为通过 3、部分过滤器可指定参数，如perms，roles
// */
// @Bean(name = "shiroFilter")
// public ShiroFilterFactoryBean getShiroFilterFactoryBean(SecurityManager securityManager,
// KickoutSessionControlFilter kickoutSessionControlFilter) {
// ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// // 必须设置 SecurityManager
// shiroFilterFactoryBean.setSecurityManager(securityManager);
//
// // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
// shiroFilterFactoryBean.setLoginUrl("/admin/login");
// // 登录成功后要跳转的链接
// // shiroFilterFactoryBean.setSuccessUrl("/admin/index");
// // 未授权界面，注:注解方式验证权限不好使;
// // shiroFilterFactoryBean.setUnauthorizedUrl("/admin/403");
//
// // 自定义登出过滤器，设置登出后跳转地址
// Map<String, Filter> filters = new LinkedHashMap<>();
//
// // 自定义登录过滤器
// filters.put("myLogin", loginFilter());
// // 自定义限制同一账号登录数量filter
// filters.put("kickout", kickoutSessionControlFilter);
// // 自定义退出跳转页面
// LogoutFilter logoutFilter = new SystemLogoutFilter();
// logoutFilter.setRedirectUrl("/admin/login");
// filters.put("myLogout", logoutFilter);
//
// shiroFilterFactoryBean.setFilters(filters);
//
// // 过虑器链定义，从上向下顺序执行，一般将/**放在最下边
// Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
// // 配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了
// filterChainDefinitionMap.put("/admin/logout", "myLogout");
// // 登录请求匿名访问
// filterChainDefinitionMap.put("/admin/login", "myLogin");
//
// // 过滤链定义，从上向下顺序执行，一般将放在最为下边:这是一个坑呢，一不小心代码就不好使了;
// // authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问
// filterChainDefinitionMap.put("/admin/**", "authc,kickout");
// shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
// return shiroFilterFactoryBean;
// }
//
// /**
// * 凭证匹配器 （由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了）
// *
// * @return
// */
// @Bean
// public HashedCredentialsMatcher hashedCredentialsMatcher() {
// HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
// hashedCredentialsMatcher.setHashAlgorithmName("md5");// 散列算法:这里使用MD5算法;
// hashedCredentialsMatcher.setHashIterations(2);// 散列的次数，比如散列两次，相当于 md5(md5(""));
// return hashedCredentialsMatcher;
// }
//
// /**
// * 自定义身份认证realm
// *
// * @return
// */
// @Bean
// public ShiroRealm shiroRealm() {
// ShiroRealm shiroRealm = new ShiroRealm();
// shiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
// return shiroRealm;
// }
//
// /**
// * 配置shiro redisManager 使用的是shiro-redis开源插件
// *
// * @return
// */
// @Bean
// public CustomRedisManager customRedisManager() {
// return new CustomRedisManager();
// }
//
// /**
// * cacheManager缓存 redis实现 使用的是shiro-redis开源插件
// *
// * @return
// */
// @Bean
// public RedisCacheManager redisCacheManager() {
// RedisCacheManager redisCacheManager = new RedisCacheManager();
// redisCacheManager.setRedisManager(customRedisManager());
// return redisCacheManager;
// }
//
// /**
// * RedisSessionDAO shiro sessionDao层的实现 通过redis 使用的是shiro-redis开源插件
// */
// @Bean
// public RedisSessionDAO redisSessionDAO() {
// RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
// redisSessionDAO.setRedisManager(customRedisManager());
// return redisSessionDAO;
// }
//
// /**
// * shiro session管理
// */
// @Bean
// public DefaultWebSessionManager sessionManager() {
// DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
// sessionManager.setSessionDAO(redisSessionDAO());
// return sessionManager;
// }
//
// @Bean
// public SecurityManager securityManager() {
// DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// // 设置realm
// securityManager.setRealm(shiroRealm());
// // 自定义缓存实现 使用redis
// securityManager.setCacheManager(redisCacheManager());
// // 自定义session管理 使用redis
// securityManager.setSessionManager(sessionManager());
// return securityManager;
// }
//
// /**
// * 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证
// * 配置以下两个bean(DefaultAdvisorAutoProxyCreator和AuthorizationAttributeSourceAdvisor)即可实现此功能
// *
// * @return
// */
// @Bean
// public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
// DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
// advisorAutoProxyCreator.setProxyTargetClass(true);
// return advisorAutoProxyCreator;
// }
//
// /**
// * 开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;
// *
// * @param securityManager
// * @return
// */
// @Bean
// public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
// AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
// authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
// return authorizationAttributeSourceAdvisor;
// }
//
// /**
// * shiro 方言配置
// *
// * @return
// */
// @Bean
// public ShiroDialect shiroDialect() {
// return new ShiroDialect();
// }
//
// /*
// * @methodName: loginFilter
// *
// * @param: []
// *
// * @description:登录过滤器
// *
// * @return: com.codemart.lanze.shiro.LoginFilter
// *
// * @author: lanze
// *
// * @date: 2017/7/28 16:27
// *
// * @version: V1.0.0
// */
// @Bean
// public LoginFilter loginFilter() {
// return new LoginFilter();
// }
//
// }